﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;

namespace Montezuma
{
    class Heroi
    {
        Texture2D textura;
        public Vector2 posicao;
        List<Animacao> animacoes = new List<Animacao>();
        Animacao animacaoAndando;
        Animacao animacaoParado;
        public Vector2 posicaoInicial;
        

        public Vector2 diferencaRetangulo = new Vector2(17, 10);
        public int distanciaChao = 70;
        public int distanciaParedeDir = 36;
        public int distanciaParedeEsq = 18;

        SpriteEffects spriteEffects = SpriteEffects.None;

        public int vidas = 3;

        public bool chao = false;
        public bool parede = false;
        public bool dir = true;
        public bool esq = true;
        public bool parado = true;
        public bool cima = false;
        public bool baixo = false;
        public bool pulo = false;
        public bool pulando = false;
        public bool pararPulo;
        public bool caindo = true;
        bool puloPressionado = false;
        public bool morte = false;

        public int gravidade = 5;
        public int velocidade = 2;
        public int velocidadePulo = 5;
        public TimeSpan tempoPulo = TimeSpan.Zero;


        public bool escada = false;
        public bool subindo = false;
        public bool descerEscada = false;

        public bool corda = false;

        public Rectangle retangulo;
        public Rectangle retanguloPe;
        public Rectangle retanguloCorpo;
        public Rectangle retanguloCabeca;

        public Heroi(Texture2D textura, Vector2 posicao)
        {
            this.textura = textura;
            this.posicao = posicao;
            posicaoInicial = Vector2.Zero;

            animacaoParado = new Animacao(textura, posicao, new Point(0, 81), new Point(52, 73), 1, 1, false);
            animacaoAndando = new Animacao(textura, posicao, Point.Zero , new Point(59, 73), 9, 11, true);
            animacoes.Add(animacaoParado);
            animacoes.Add(animacaoAndando);
        }

        public void Animacao(GameTime gameTime)
        {
            for (int a = 0; a < animacoes.Count; a++)
            {
                animacoes[a].spriteEffects = spriteEffects;
                animacoes[a].posicao = posicao;
                animacoes[a].Update(gameTime);

                if (dir)
                {
                    animacoes[a].spriteEffects = SpriteEffects.None;
                }

                if (esq)
                {
                    animacoes[a].spriteEffects = SpriteEffects.FlipHorizontally;
                }

                if (parado && esq)
                {
                    animacaoParado.tamanhoFrame.X = 62;
                }
            }
        }

        public void CordaContinuar()
        {
            subindo = true;
        }

        public void Controle()
        {
            KeyboardState teclado = Keyboard.GetState();

            if (teclado.IsKeyDown(Keys.W))
            {
                if (escada || corda)
                {
                    subindo = true;
                    gravidade = 0;
                    posicao.Y -= 2;
                }

                cima = true;
            }
            else
            {
                cima = false;
            }

            if (teclado.IsKeyDown(Keys.S))
            {
                if (subindo && chao == false || descerEscada || corda && chao == false)
                {
                    posicao.Y += 2;
                    subindo = true;
                    gravidade = 0;
                }
                baixo = true;
            }
            else
            {
                baixo = false;
            }

            if (teclado.IsKeyDown(Keys.A))
            {
                posicao.X -= velocidade;
                esq = true;
                dir = false;
                parado = false;
            }

            if (teclado.IsKeyDown(Keys.D))
            {
                
                posicao.X += velocidade;
                dir = true;
                esq = false;
                parado = false;
            }

            if (teclado.IsKeyUp(Keys.A) && teclado.IsKeyUp(Keys.D))
            {
                parado = true;
            }
            

            if (teclado.IsKeyDown(Keys.Space))
            {
                if (pulo && puloPressionado == false)
                {
                    pulando = true;
                }
                pulo = false;
                puloPressionado = true;

                if (subindo && cima == false)
                {
                    subindo = false;
                }
            }
            if (teclado.IsKeyUp(Keys.Space))
            { 
                if (pulando)
                {
                    pararPulo = true;
                }
                puloPressionado = false;
            }

            if (teclado.IsKeyDown(Keys.Escape))
            {
                posicao = posicaoInicial;
            }
        }

        public void Update(GameTime gameTime)
        {
            retangulo = new Rectangle((int)posicao.X + (int)diferencaRetangulo.X, (int)posicao.Y + (int)diferencaRetangulo.Y, 20, 60);
            retanguloCorpo = new Rectangle((int)retangulo.X, retangulo.Y + 10, 20, 45);
            retanguloPe = new Rectangle(retangulo.X + 3, retangulo.Y + 60, 14, 5);
            retanguloCabeca = new Rectangle(retangulo.X + 2, retangulo.Y, 16, 5);

            Animacao(gameTime);

            Controle();

            if (pulando)
            {
                if (subindo == false)
                {
                    posicao.Y -= velocidadePulo;
                }

                tempoPulo += gameTime.ElapsedGameTime;

                if (tempoPulo.TotalMilliseconds > 350)
                {
                    //pulando = false;
                    //tempoPulo = TimeSpan.Zero;
                    velocidadePulo -= 1;

                    if (velocidadePulo <= 0)
                    {
                        velocidadePulo = 0;
                        pulando = false;
                        tempoPulo = TimeSpan.Zero;
                    }
                }
            }

            if (subindo == false && pulando == false)
            {
                gravidade = 5;
            }
            
            if (chao && descerEscada == false)
            {
                pulo = true;
                velocidadePulo = 10;

                if (cima == false)
                {
                    subindo = false;
                }
            }
            
            if (caindo)
            {
                posicao.Y += gravidade;
                chao = false;
                parede = false;
            }

            if (corda && subindo && escada == false)
            {
                posicao.Y += 1;
                pulo = true;
                velocidadePulo = 2;
            }

            if (subindo)
            {
                tempoPulo = TimeSpan.Zero;
            }

            if (escada && subindo)
            {
                pulo = false;
                pulando = false;
            }
        }

        public void Draw(SpriteBatch spriteBatch)
        {
            //spriteBatch.Draw(textura, retangulo, new Rectangle(0, 0, textura.Width, textura.Height), Color.White);
            if (dir  && parado == false)
            {
                animacaoAndando.Draw(spriteBatch);
            }

            if (esq && parado == false)
            {
                animacaoAndando.Draw(spriteBatch);
            }

            if (parado)
            {
                animacaoParado.Draw(spriteBatch);
                animacaoAndando.ativo = false;
            }
        }
    }
}
